SPDX-FileCopyrightText: 2022 Elias Chabbi & Etienne Poinas SPDX-FileCopyrightText: 2024 AlICe laboratory https://alicelab.be
SPDX-License-Identifier: GPL-3.0-or-later
Ianis Xenakis: Achorripsis
import bpy
import random
import mathdef clean():
    bpy.ops.object.select_all(action="SELECT")
    bpy.ops.object.delete()
    bpy.ops.outliner.orphans_purge()
clean()import bpy
import numpy as npdef make_poisson(lam1, lam2, lam3):how many cubes you want to add
    count = 10wrap next part in a loop to generate more than 1 sample
    Tabbivariate1 = []
    Tabbivariate2 = []
    for i in range(100):
        a = np.random.poisson(lam1)
        b = np.random.poisson(lam2)
        c = np.random.poisson(lam3)
        Tabbivariate1.append(a + c)  # follows Poi(lam1+lam3)
        Tabbivariate2.append(b + c)  # follows Poi(lam2+lam3)Tableaux
    Tabbivariate1 = np.array(Tabbivariate1)  # elements
    Tabbivariate2 = np.array(Tabbivariate2)  # elements
    hist, xedges, yedges = np.histogram2d(
        Tabbivariate1, Tabbivariate2, bins=10, range=[[0, 10], [0, 10]]
    )
    xpos, ypos = np.meshgrid(xedges[:-1] + 0.25, yedges[:-1] + 0.25, indexing="ij")
    xpos = xpos.ravel()
    ypos = ypos.ravel()
    zpos = 0Construct arrays with the dimensions for the 100 bars.
    dx = dy = 0.8 * np.ones_like(zpos)
    dz = hist.ravel()
    dz = dz.reshape((10, 10))
    dz = dz / 6  # To have them smaller in depth
    return dz
dz = make_poisson(1.3, 0.6, 2.2)
count = 10bpy.ops.mesh.primitive_grid_add(
    enter_editmode=False, align="WORLD", location=(4.5, 4.5, 0.15), scale=(1, 1, 1)
)
glissandi = bpy.data.objects["Grid"].data
vals = []
for line in dz:
    for v in line:
        vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
    point.co.z = z_val
bpy.ops.transform.resize(value=(5, 5, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")Percussions = bpy.data.collections.new("Percussions")
for c in range(0, count):
    for d in range(0, count):
        x = c
        y = d
        z = 9
        if dz[c][d] > 0:
            bpy.ops.mesh.primitive_uv_sphere_add(
                radius=d / (c + 1),
                enter_editmode=False,
                align="WORLD",
                location=(x, y, 1.666 + dz[c][d]),
                scale=(1, 1, 1),
            )
            bpy.ops.object.shade_smooth()for c in range(0, count):
    for d in range(0, count):
        x = c
        y = d
        z = 9
        if dz[c][d] > 0:
            bpy.ops.mesh.primitive_cone_add(
                radius1=0.6 + (dz[c][d] / 1.2),
                radius2=0,
                depth=(dz[c][d]),
                enter_editmode=True,
                location=(x, y, 3.333 - dz[c][d] / 2),
                rotation=(0, math.pi, 0),
                scale=(0.6, 0.6, dz[c][d] / 4),
            )subdivise
            bpy.ops.mesh.subdivide(
                number_cuts=20, smoothness=0, fractal=0, fractal_along_normal=0
            )sharp
            bpy.context.scene.tool_settings.use_proportional_edit = True
            bpy.context.scene.tool_settings.proportional_edit_falloff = "SHARP"
            bpy.ops.object.editmode_toggle()
            bpy.ops.object.modifier_add(type="WAVE")
            bpy.context.object.modifiers["Wave"].falloff_radius = 2
            bpy.context.object.modifiers["Wave"].height = 2 + dz[c][d] * 3
            bpy.context.object.modifiers["Wave"].width = 100
            bpy.ops.object.modifier_apply(modifier="Wave")dz = make_poisson(1, 2, 3)grille #
bpy.ops.mesh.primitive_grid_add(
    x_subdivisions=10,
    y_subdivisions=4,
    enter_editmode=False,
    align="WORLD",
    location=(4.5, 4.5, 5),
    scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.001"].data
vals = []
for line in dz:
    for v in line:
        vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
    point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(3, 0.3, 3)grille #
bpy.ops.mesh.primitive_grid_add(
    x_subdivisions=10,
    y_subdivisions=4,
    enter_editmode=False,
    align="WORLD",
    location=(4.5, 6.5, 5),
    rotation=(0, math.pi, 0),
    scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.002"].data
vals = []
for line in dz:
    for v in line:
        vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
    point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(0.7, 0.2, 7.2)grille #
bpy.ops.mesh.primitive_grid_add(
    x_subdivisions=5,
    y_subdivisions=8,
    enter_editmode=False,
    align="WORLD",
    location=(4.5, 8.5, 5),
    scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.003"].data
vals = []
for line in dz:
    for v in line:
        vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
    point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(1.8, 0.9, 2.9)Grille #
bpy.ops.mesh.primitive_grid_add(
    x_subdivisions=5,
    y_subdivisions=10,
    enter_editmode=False,
    align="WORLD",
    location=(4.5, 2.5, 5),
    rotation=(0, math.pi, 0),
    scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.004"].data
vals = []
for line in dz:
    for v in line:
        vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
    point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")dz = make_poisson(0.6, 1, 3)Grille #
bpy.ops.mesh.primitive_grid_add(
    x_subdivisions=7,
    y_subdivisions=4,
    enter_editmode=False,
    align="WORLD",
    location=(4.5, 0.5, 5),
    scale=(1, 1, 1),
)
glissandi = bpy.data.objects["Grid.005"].data
vals = []
for line in dz:
    for v in line:
        vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
    point.co.z = z_val
bpy.ops.transform.resize(value=(5, 1, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")Epaissseur #
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")for c in range(0, count):
    for d in range(0, count):
        x = c
        y = d
        z = 9
        if dz[c][d] > 0:            bpy.ops.curve.spirals(
                spiral_type="ARCH",
                turns=2,
                steps=22,
                edit_mode=False,
                radius=0.1,
                dif_radius=0.5,
                dif_z=(dz[c][d]) * 10,
                startlocation=(x, y, 6.666 - dz[c][d] * 13),
                rotation_euler=(0, 0, 0),
            )
            curve_object = bpy.data.objects["Spiral"]
            bpy.context.object.data.offset = 0.15
            bpy.context.object.data.extrude = 0.15            bpy.data.objects["Spiral"].select_set(True)
            bpy.ops.object.convert(target="MESH")
            bpy.ops.object.modifier_add(type="SOLIDIFY")
            bpy.context.object.modifiers["Solidify"].thickness = (dz[c][d]) / 2.2
            bpy.context.object.modifiers["Solidify"].offset = (dz[c][d]) / 6
            bpy.ops.object.modifier_apply(modifier="Solidify")for c in range(0, count):
    for d in range(0, count):
        x = c
        y = d
        z = 9
        if dz[c][d] > 0:
            bpy.ops.mesh.primitive_uv_sphere_add(
                segments=50,
                ring_count=30,
                enter_editmode=False,
                location=(x, y, 8.333 - dz[c][d] * 3),
                rotation=(0, 0, d),
                scale=(0.5, 0.5, 1),
            )            bpy.ops.object.modifier_add(type="SUBSURF")
            bpy.context.object.modifiers["Subdivision"].levels = 3
            bpy.context.object.modifiers["Subdivision"].render_levels = 3
            bpy.ops.object.modifier_apply(modifier="Subdivision")            bpy.ops.object.modifier_add(type="WAVE")
            bpy.context.object.modifiers["Wave"].use_x = False
            bpy.context.object.modifiers["Wave"].falloff_radius = 0
            bpy.context.object.modifiers["Wave"].height = 1
            bpy.context.object.modifiers["Wave"].width = 4
            bpy.context.object.modifiers["Wave"].narrowness = 4
            bpy.ops.object.modifier_apply(modifier="Wave")loi de poisson #
dz = make_poisson(1.6, 1.1, 0.5)grille #
bpy.ops.mesh.primitive_grid_add(
    enter_editmode=False, align="WORLD", location=(4.3, 4.5, 9.85), scale=(1, 1, 1)
)
glissandi = bpy.data.objects["Grid.006"].data
vals = []
for line in dz:
    for v in line:
        vals.append(v)
for point, z_val in zip(glissandi.vertices, vals):
    point.co.z = z_val
bpy.ops.transform.resize(value=(5, 5, 5))
bpy.ops.object.modifier_add(type="SUBSURF")
bpy.context.object.modifiers["Subdivision"].levels = 3
bpy.ops.object.modifier_apply(modifier="Subdivision")
bpy.ops.object.modifier_add(type="SOLIDIFY")
bpy.context.object.modifiers["Solidify"].thickness = 0.04
bpy.ops.object.modifier_apply(modifier="Solidify")
bpy.ops.transform.rotate(
    value=3.14159,
    orient_axis="X",
    orient_type="GLOBAL",
    orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)),
    constraint_axis=(True, False, False),
    proportional_size=1,
)